/*
 * 处理实体的类，实体的属性和技能分别保存在 skillList和 properties里。
 * 具体的实体将在 Entities 文件夹内定义
 * 使用 learnSkill 和 unlearnSkill 来获得和失去技能。
 * 在游戏流程外，使用 useLater 来使用技能。 useSkill 仅被 Game 调用。
 *
 * 属性使用字符串存储，具体存储方式为：
 * 整数：转换为数字串存储（使用std::to_string和std::stoi转换）
 * 布尔：存为"true"或"false"
 * 此外，用空串代表无意义值（未设定值）
 *
 * 目前所有的属性有（字典序排序）：
 * attack_range 整数 （已废弃）攻击范围（欧氏距离的平方≤范围即可攻击），不能攻击的设为-1
 * dead         布尔 是否死亡
 * energy       整数 能量值
 * hp           整数 生命值
 * max_hp       整数 最大生命值
 * max_transfer 整数 最大传输量
 * link_in      整数|整数|... 所有从外部连入的节点编号
 * link_out     整数|整数|... 所有连出的节点编号
 * produce_rate  浮点数 采集效率
 */
#ifndef ENTITY_H
#define ENTITY_H

class Entity;

#include <map>
#include <string>
#include "prefixobject.h"
#include "skill.h"

class Game;
class Entity;



class Entity: public PrefixObject{
private:
public:
    Game* g;
    std::map<std::string, Skill*> skillList;
    std::map<std::string, std::string> properties;

    std::string id;
    explicit Entity(): PrefixObject(){
        this->setName("Entity");
    }
    virtual ~Entity();
    explicit Entity(const Entity&) = delete;
    Entity& operator=(const Entity&) = delete;
    explicit Entity(const Entity&&) = delete;
    Entity& operator=(const Entity&&) = delete;

    void learnSkill(Skill* skill);
    void unlearnSkill(Skill* skill);
	bool hasSkill(const std::string &name);
    void useSkill(Skill* skill, const std::vector<std::string> &params);
    void useSkill(const std::string &name, const std::vector<std::string> &params);
    void useLater(const std::string &name, const std::vector<std::string> &params);

    virtual Json::Value toJson() override;
};

#endif /* end of include guard: ENTITY_H */
